package com.baizhiedu.dynamic;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

/**
 * 功能：
 * 作者：HZj
 * 日期：2024/12/19 20:35
 */
/*
* 动态代理开发之方式1：实现MethodBeforemAdvice接口
* 一.开发步骤：
*   1.创建原始对象(目标对象)；
*   2.额外功能
*       MethodBeforeAdvice接口
*       额外的功能书写在接口的实现中，运行在原始方法执行之前运行额外功能
*   3.定义切入点
*       切入点：额外共嗯那个加入的位置
*           目的：有程序员根据自己的需要，决定额外功能加入给哪个原始方法（register login）
*           简单的测试：所有方法都作为切入点，都假如额外的功能
*       <aop:config>
*           <aop:pointcut id="pc" expression="execution(* *(..))"/>
*       </aop:config>
*   4.组装（2、3整合）
*       表达式的含义：所有的方法 都加入before的额外功能
*       <aop:advisor advice-ref="before" pointcut-ref="pc"/>
*   5.调用
*       目的：获得Spring工厂创建的动态代理对象，并进行调用
*       ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
*       注意：
*           1.Spring的工厂通过原始对象的id值获得的是代理对象
*           2.获得代理对象后，可以通过声明接口类型，进行对象的存储
*       UserService UserService = (UserService)ctx.getBean("UserService")
* 二.细节分析
*   1.Spring创建的动态代理类在哪里？
*       Spring框架在运行时，通过动态字节码技术(通过第三方的动态字节码框架[如ASM、Javassist、Cglib]，直接在JVM生成字节码[动态字节码])，在JVM创建的，运行在JVM内部，等程序结束后，会和JVM一起消失
*       什么叫动态字节码技术：通过第三方动态字节码框架，在JVM中创建对应类的字节码，进而创建对象，当虚拟机结束，动态字节码跟着消失
*       结论：动态代理不需要定义类文件，都是JVM运行过程中动态创建的，所以不会造成静态代理，类文件数量过多，影响项目管理的问题；
*/
public class Before implements MethodBeforeAdvice {
    /*
    * 作用：需要把运行在原始方法之前运行的额外功能，书写在before方法中
    */
    @Override
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println("----method before advice log----");
    }
}
